JWT چیست؟ نگاهی ساده و کاربردی به یکی از محبوب‌ترین روش‌های احراز هویت در برنامه‌های مدرن

jwt

امروزه تقریباً هر برنامه‌ای که با آن کار می‌کنیم، از یک سیستم ورود و مدیریت کاربران استفاده می‌کند. از فروشگاه‌های اینترنتی گرفته تا پنل‌های سازمانی، اپلیکیشن‌های موبایل و سرویس‌های بزرگ مبتنی بر API، همه باید بدانند کاربری که درخواست ارسال کرده چه کسی است و چه دسترسی‌هایی دارد.

اینجاست که مفهوم Authentication و Authorization اهمیت پیدا می‌کند.

اما یک سؤال مهم:

وقتی کاربر وارد سیستم شد، برنامه در درخواست‌های بعدی چطور بفهمد این همان کاربر قبلی است؟

یکی از محبوب‌ترین پاسخ‌ها به این سؤال، استفاده از JWT (JSON Web Token) است.

JWT چیست؟

JWT مخفف:

JSON Web Token

است.

به زبان ساده، JWT یک توکن دیجیتال است که اطلاعاتی درباره کاربر یا درخواست او را به شکل امن بین دو بخش یک سیستم منتقل می‌کند.

برای مثال:

کاربر وارد سایت می‌شود:

Username: Ali
Password: 123456

سرور اطلاعات را بررسی می‌کند و اگر درست باشد، یک Token به کاربر برمی‌گرداند:

eyJhbGciOiJIUzI1NiIsInR5cCI6...

از این به بعد کاربر به جای ارسال دوباره Username و Password، همین Token را همراه درخواست‌های خود ارسال می‌کند.

JWT چه مشکلی را حل می‌کند؟

در روش‌های قدیمی‌تر معمولاً از Session استفاده می‌شد.

در Session:

  1. کاربر Login می‌کند.

  2. سرور اطلاعات کاربر را در حافظه یا دیتابیس ذخیره می‌کند.

  3. یک Session ID به کاربر می‌دهد.

  4. در درخواست‌های بعدی Session ID ارسال می‌شود.

این روش در بسیاری از پروژه‌ها هنوز کاربرد دارد، اما در معماری‌های جدید مثل:

  • Microservices

  • Web API

  • Mobile Application

  • Cloud Application

مدیریت Session سخت‌تر می‌شود.

JWT کمک می‌کند سرور نیاز نداشته باشد وضعیت کاربر را نگهداری کند.

به این مدل می‌گوییم:

Stateless Authentication

یعنی سرور برای تشخیص کاربر نیازی به ذخیره Session ندارد.

ساختار JWT چگونه است؟

یک JWT از سه بخش اصلی تشکیل شده است:

Header.Payload.Signature

سه قسمت با نقطه از هم جدا می‌شوند.

1. Header

در Header اطلاعات مربوط به نوع Token و الگوریتم رمزنگاری قرار می‌گیرد.

مثلاً:

{
  "alg": "HS256",
  "typ": "JWT"
}

یعنی:

  • نوع توکن JWT است.

  • الگوریتم امضا HS256 است.

2. Payload

Payload شامل اطلاعات اصلی Token است.

مثلاً:

{
  "id": 100,
  "username": "Ali",
  "role": "Admin",
  "exp": 1750000000
}

در این بخش معمولاً اطلاعاتی مثل:

  • شناسه کاربر

  • نقش کاربر

  • زمان انقضا

  • Permissionها

قرار می‌گیرد.

نکته مهم:

Payload رمزنگاری نمی‌شود، فقط Encode می‌شود.

پس نباید اطلاعات حساس مثل:

  • Password

  • اطلاعات مالی

  • اطلاعات محرمانه

داخل آن قرار گیرد.

3. Signature

Signature برای اطمینان از معتبر بودن Token استفاده می‌شود.

سرور با استفاده از یک Secret Key امضا ایجاد می‌کند.

اگر کسی Payload را تغییر دهد، Signature دیگر معتبر نخواهد بود.

JWT در عمل چگونه کار می‌کند؟

فرآیند معمول:

User
 |
 | Username + Password
 ↓
Authentication Server
 |
 | Generate JWT
 ↓
User
 |
 | Send Token
 ↓
API Server
 |
 | Validate Token
 ↓
Response

کاربردهای JWT

1. احراز هویت کاربران (Authentication)

مهم‌ترین کاربرد JWT همین است.

مثلاً:

  • ورود به سایت

  • ورود به پنل مدیریت

  • اپلیکیشن موبایل

بعد از Login، کاربر Token دریافت می‌کند.

2. ارتباط بین Frontend و Backend

در معماری‌های جدید:

React / Angular / Vue

        |

      API

        |

   Database

Frontend اطلاعات کاربر را با JWT به Backend معرفی می‌کند.

3. Microservices

در معماری Microservice چندین سرویس مستقل داریم.

مثلاً:

User Service

Order Service

Payment Service

Report Service

JWT کمک می‌کند همه سرویس‌ها بتوانند هویت کاربر را بررسی کنند.

4. اپلیکیشن‌های موبایل

در موبایل، نگهداری Session سمت سرور همیشه بهترین انتخاب نیست.

JWT به دلیل Stateless بودن برای:

  • Android

  • iOS

بسیار رایج است.

مزایای JWT

1. بدون نیاز به ذخیره Session

بزرگ‌ترین مزیت JWT این است که Server اطلاعات Session کاربران را نگهداری نمی‌کند.

در نتیجه:

  • مصرف حافظه کمتر

  • مقیاس‌پذیری بهتر

  • مناسب Cloud

2. مناسب برای API

JWT دقیقاً برای سناریوی API طراحی شده است.

به راحتی بین:

  • Browser

  • Mobile App

  • Desktop Application

  • Serviceها

منتقل می‌شود.

3. سرعت بالا

چون برای اعتبارسنجی فقط Signature بررسی می‌شود، معمولاً نیاز به Query اضافی به دیتابیس نیست.

4. قابل استفاده در سیستم‌های مختلف

یک Token می‌تواند توسط تکنولوژی‌های مختلف بررسی شود:

  • ASP.NET Core

  • Node.js

  • Java

  • Python

معایب JWT

هر تکنولوژی در کنار مزایا، محدودیت‌هایی هم دارد.

JWT هم استثنا نیست.

1. امکان Logout فوری سخت‌تر است

در Session کافی است Session را حذف کنیم.

اما در JWT:

اگر Token صادر شده باشد، تا زمان انقضا معتبر است.

برای حل این مشکل معمولاً از:

  • کوتاه کردن زمان انقضا

  • Refresh Token

  • Blacklist Token

استفاده می‌شود.

2. حجم Token بیشتر از Session ID است

Session فقط یک شناسه کوچک است.

اما JWT خودش شامل اطلاعات است.

پس حجم درخواست‌ها کمی بیشتر می‌شود.

3. اگر Secret Key لو برود، مشکل امنیتی ایجاد می‌شود

امنیت JWT کاملاً وابسته به نگهداری صحیح:

Secret Key

است.

نباید:

  • داخل کد قرار گیرد.

  • داخل Git ذخیره شود.

  • در اختیار افراد غیرمجاز باشد.

4. Payload رمزگذاری نشده است

بسیاری تصور می‌کنند JWT اطلاعات را Encrypt می‌کند.

اما واقعیت این است:

JWT معمولاً فقط Sign می‌شود، نه Encrypt.

یعنی هر کسی Token را داشته باشد می‌تواند Payload را بخواند.

JWT یا Session؟

هیچ‌کدام همیشه بهتر نیستند.

انتخاب به نوع پروژه بستگی دارد.

SessionJWT
مناسب Web سنتیمناسب API
Server State داردStateless
Logout ساده‌ترLogout پیچیده‌تر
مدیریت مرکزیمناسب Microservice

نکات امنیتی مهم در استفاده از JWT

برای استفاده صحیح:

✅ همیشه از HTTPS استفاده کنید.

✅ زمان انقضای کوتاه برای Access Token قرار دهید.

✅ از Refresh Token استفاده کنید.

✅ اطلاعات حساس داخل Payload قرار ندهید.

✅ Secret Key را امن نگهداری کنید.

✅ Token را در محل امن ذخیره کنید.

JWT در ASP.NET Core

در ASP.NET Core JWT یکی از روش‌های استاندارد Authentication است.

معمولاً با این موارد استفاده می‌شود:

  • Authentication Middleware

  • Authorization Policy

  • Role Based Authorization

مثلاً:

[Authorize]
public IActionResult GetUsers()
{
    return Ok();
}

یعنی فقط کاربری که Token معتبر دارد اجازه اجرای این API را دارد.

جمع‌بندی

JWT یکی از مهم‌ترین ابزارهای دنیای توسعه نرم‌افزار مدرن است. این تکنولوژی با حذف وابستگی به Session و فراهم کردن یک روش استاندارد برای انتقال هویت، نقش مهمی در ساخت APIها، اپلیکیشن‌های موبایل و معماری‌های Microservice دارد.

اما JWT یک راه‌حل جادویی نیست. اگر درست طراحی نشود، مشکلاتی مثل سختی Logout، مدیریت Token و مسائل امنیتی ایجاد می‌کند.

شناخت درست JWT یعنی بدانیم کجا از آن استفاده کنیم، چگونه امن از آن استفاده کنیم و چه زمانی سراغ روش‌های دیگر برویم.